package com.onlyxiahui.common.utils.extend.change;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.onlyxiahui.common.utils.base.beans.BeanToMapUtil;
import com.onlyxiahui.common.utils.base.compare.DifferentValueUtil;
import com.onlyxiahui.common.utils.base.compare.DifferentValueUtil.Different;

/**
 * 
 * Description 业务新增/修改等日志生成工具<br>
 * Date 2020-11-10 09:02:05<br>
 * 
 * @author XiaHui [onlovexiahui@qq.com]<br>
 * @since 1.0.0
 */
public class DataChangeUtil {

	public static UpdateFormat updateFormat = new UpdateFormatImpl();
	public static AddFormat addFormat = new AddFormatImpl();

	/**
	 * 
	 * @param propertyDescribeMap
	 * @param oldData
	 * @param newData
	 * @param updateFormat        ：自定义输出格式
	 * @return
	 */
	/**
	 * 
	 * Description 生成对象自动修改日志，<br>
	 * Date 2020-11-10 16:31:04<br>
	 * 
	 * @param <T>
	 * @param <E>
	 * @param propertyDescribeMap ：需要比较的字段以及描述Map<属性名,属性描述>
	 * @param oldData             ：修改前对象
	 * @param oldNullSkip         ：修改前对象的属性为null是否跳过（就是不比较差异）
	 * @param newData             ：修改后对象
	 * @param newNullSkip         ：修改前对后的属性为null是否跳过（就是不比较差异）比如把name=""字段设置name=null，表示数据库不修改，即可以跳过比较
	 * @param updateFormat
	 * @return
	 * @since 1.0.0
	 */
	public static <T, E> String getUpdateContent(
			Map<String, String> propertyDescribeMap,
			T oldData,
			boolean oldNullSkip,
			E newData,
			boolean newNullSkip,
			UpdateFormat updateFormat) {
		String text = "";
		List<Different> list = null;
		List<String> propertyList = null;
		if (null != propertyDescribeMap) {
			propertyList = new ArrayList<String>();
			propertyList.addAll(propertyDescribeMap.keySet());
		}
		list = DifferentValueUtil.different(propertyList, oldData, oldNullSkip, newData, newNullSkip);
		if (null != list && !list.isEmpty()) {
			text = getUpdateContent(propertyDescribeMap, list, updateFormat);
		}
		return text;
	}

	public static <T, E> String getUpdateContent(
			Map<String, String> propertyDescribeMap,
			T oldData,
			boolean oldNullSkip,
			E newData,
			boolean newNullSkip) {
		return getUpdateContent(propertyDescribeMap, oldData, oldNullSkip, newData, newNullSkip, updateFormat);
	}

	/**
	 * 生成修改日志
	 * 
	 * @param propertyDescribeMap ：字段描述
	 * @param oldData             ：旧数据
	 * @param newData             ：新数据
	 * @return
	 */
	public static <T, E> String getUpdateContent(Map<String, String> propertyDescribeMap, T oldData, E newData) {
		return getUpdateContent(propertyDescribeMap, oldData, false, newData, true, updateFormat);
	}

	/**
	 * 
	 * @param propertyDescribeMap
	 * @param list
	 * @param updateFormat
	 * @return
	 */
	public static String getUpdateContent(Map<String, String> propertyDescribeMap, List<Different> list, UpdateFormat updateFormat) {
		return updateFormat.getContent(propertyDescribeMap, list);
	}

	/***************************************************/

	/**
	 * 新增数据日志
	 * 
	 * @param propertyDescribeMap
	 * @param data
	 * @param addFormat
	 * @return
	 */
	public static <T, E> String getAddContent(Map<String, String> propertyDescribeMap, T data, AddFormat addFormat) {
		Map<String, Object> dataMap = BeanToMapUtil.toMap(data);
		return addFormat.getContent(propertyDescribeMap, dataMap);
	}

	/**
	 * 新增数据日志
	 * 
	 * @param propertyDescribeMap
	 * @param data
	 * @return
	 */
	public static <T, E> String getAddContent(Map<String, String> propertyDescribeMap, T data) {
		return getUpdateContent(propertyDescribeMap, data, addFormat);
	}

	public static <T, E> String getAddContent(T data, AddFormat addFormat) {
		return getUpdateContent(null, data, addFormat);
	}

	public static <T, E> String getAddContent(T data) {
		return getUpdateContent(null, data, addFormat);
	}
}
